/************************************************************************
 * $Id: Convert.java,v 1.2 2010/02/10 07:38:03 wqf Exp $
 * Created on Oct 20, 2008 9:05:21 AM By wqf
 *
 * framework_zh 
 *
 * Copyright (c) 2007-2008 Herostart Group.
 * All rights reserved.
 * <a href="http://www.herostart.com.cn">http://www.herostart.com.cn</a>
 ***********************************************************************/
package com.java.mis;

import java.util.List;
import java.util.ArrayList;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * <p>类型转换</p>
 *
 * 
 * @author $Author: wqf $
 * @version $Revision: 1.2 ${Date}:2010-2-8 下午01:49:56 $
 */
public class Convert {
	final static Logger logger = LoggerFactory.getLogger(Convert.class);
	/**
	 * 将给定的值转换为Long值。
	 * 无法转换或精度超过范围或非整数字字符串的情况，返回0。
	 * 
	 * @param value
	 * @return Long类型值
	 */
	public static Long toLong(Object value) {		
		if(value == null){
			return null;
		}
		Long ret = 0L;
		if (Number.class.isInstance(value)) {
			ret = ((Number) value).longValue();
		} else if (String.class.isInstance(value)) {
			String valueString = value.toString();
			if(isIntegralNumber(valueString)){
				//整数字符串进行转换
				try{
					ret = new Long(valueString);
				}	catch(NumberFormatException e){
					//有可能超过Long的精度范围
					logger.error(e.getMessage(),e);				
				}
			}
		}		
		return ret;
	}
	
	/**
	 * 将给定的值转换为Integer值。
	 * 无法转换或精度超过范围或非整数字符的情况，返回0。
	 * 
	 * @param value
	 * @return Integer类型值
	 */
	public static Integer toInteger(Object value){			
		if(value == null){
			return null;
		}
		Integer ret = 0;
		if (Number.class.isInstance(value)) {
			ret = ((Number) value).intValue();
		} else if (String.class.isInstance(value)) {
			String valueString = value.toString();
			if(isIntegralNumber(valueString)) {				
				try{//整数字符串进行转换
					ret = new Integer(valueString);
				}	catch(NumberFormatException e){
					//有可能走过Integer的精度范围
					logger.error(e.getMessage(),e);
				}
			}
		}		
		return ret;
	}
	
	/**
	 * 将给定的值转换为Double值。
	 * 无法转换或精度超过范围或非数字字符串的情况，返回0。
	 * 
	 * @param value
	 * @return Integer类型值
	 */
	public static Double toDouble(Object value){
		if(value == null){
			return null;
		}
		Double ret = 0D;
		if (Number.class.isInstance(value)) {
			ret = ((Number) value).doubleValue();
		} else if (String.class.isInstance(value)) {
			String valueString = value.toString();
			if(isNumber(valueString))	{
				try{
					ret = new Double(valueString);
				}	catch(NumberFormatException e){
					logger.error(e.getMessage(),e);
				}
			}
		}		
		return ret;
	}
	
	/**
	 * 将给定的值按指定的类型进行转换
	 * 函数未完。。。。
	 * 
	 * @param value
	 * @param anotherType
	 * @return 按指定类型转换后的值
	 */
	@SuppressWarnings("unchecked")
	public static Object toAnotherType(Object value,Class anotherType){
		if(value == null || anotherType == null){
			return value;
		}
		
		if(value.getClass().equals(anotherType)){
			return value;
		}
		
		if(anotherType.equals(Long.class)){
			return toLong(value);
		}
		
		if(anotherType.equals(Integer.class)){
			return toInteger(value);
		}
		
		return value;
	}
	
	@SuppressWarnings("unchecked")
	public static <T> List<T> toSpecificList(Class<T> cls,List genericList){
		if(genericList == null || genericList.isEmpty()){
			return new ArrayList<T>();
		}
		
		List<T> specificList = new ArrayList<T>();
		for(Object obj : genericList){
			specificList.add((T)obj);
		}
		
		return specificList;
		
	}

	/**
	 * 判断给定的字符串是否是数字数值，包括整数和实数
	 * 
	 * @param value
	 * @return true|false
	 */
	public static boolean isNumber(String value) {
		return (isIntegralNumber(value) || isRealNumber(value));
	}

	/**
	 * 判断给定的字符串是否是整数数值
	 * 若给定的值超过Long类型的精度范围，亦非整数数值。
	 * @param value
	 * @return true|false
	 */
	public static boolean isIntegralNumber(String value){
		boolean ret = true;		
		try{
			new Long(value);
		}	catch(Exception e){
			ret = false;
		}		
		return ret;
	}

	/**
	 * 判断给定的字符串是否是实数数值
	 * 若给定的值超过double类型的精度范围，亦非实数数值。
	 * @param value
	 * @return
	 */
	public static boolean isRealNumber(String value) {
		boolean ret = true;
		
		try{
			new Double(value);
		}	catch(Exception e){
			ret = false;
		}
		
		return ret;
	}

}